package org.song.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.song.model.threadlocal.WebContextUtil;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author song
 * @date 2022/3/7 13:45
 * 相应参数体拦截判断 拦截器底层基于AOP实现
 * 自定义拦截器 用来存储request response 实例到自定义 webContext中 ThreadLocal中
 **/
@Slf4j
public class WebContextInterceptor implements AsyncHandlerInterceptor {

    /*
    * 拦截器底层基于AOP实现，在整个SpringMvc调用链路中执行三次 分别对应 拦截器中三个方法
    * perHandler  处理器映射器映射目标对象之后  处理器适配器响应目标对象之前  （处理request实例）
    * postHandler 前端控制器响应视图模型对象之后 视图解析器处理视图之前 （对同步请求视图进行处理）
    * afterCompletion   视图解析器处理视图之后 响应给客户端之前 （对静态资源进行处理）
    * */

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 本次线程请求实例存入ThreadLocal中
        WebContextUtil.setCurrentRequest( request );
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 本次线程响应实例存入ThreadLocal中
        WebContextUtil.setCurrentResponse( response );
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
